package main

import "fmt"

type AnimalInterface interface {
	Sleep()
	GetType() string  // 获取动物的种类
	GetColor() string // 获取动物的名称
}

// ======================================================
type Cat struct {
	color string // 猫的颜色
}

func (this *Cat) Sleep() {
	fmt.Println("猫睡觉")
}

func (this *Cat) GetType() string {
	return "Cat"
}

func (this *Cat) GetColor() string {
	return this.color
}

// ======================================================
type Dog struct {
	color string // 狗的颜色
}

func (this *Dog) Sleep() {
	fmt.Println("狗睡觉")
}

func (this *Dog) GetType() string {
	return "Dog"
}

func (this *Dog) GetColor() string {
	return this.color
}

// =================================================
// 多态的含义
func showAnimal(animal AnimalInterface) {
	animal.Sleep() // 多态：传入参数可以是cat可以是dog
	fmt.Println(animal.GetColor())
	fmt.Println(animal.GetType())
}

func main() {
	fmt.Println("=====================")
	cat := Cat{"黄色"}
	dog := Dog{"黄色"}
	showAnimal(&cat) // 接参类型如果是interface必须传入指针
	showAnimal(&dog)
}
